package cn.fz.demo02.controller;

import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 3. 角色与权限的区别
 * 在 Spring Security 中，角色是权限的一种特殊形式。实际上，hasRole() 是基于 hasAuthority() 实现的。当我们定义角色时，Spring Security 会自动为角色加上前缀 ROLE_，所以 hasRole("ADMIN") 实际上是 hasAuthority("ROLE_ADMIN")。
 *
 * 角色：通常用于定义用户身份的层级。
 * 权限：则更细粒度地控制用户具体能做什么操作。
 * 4. 基于注解的授权控制
     除了在配置类中定义访问策略，Spring Security 还支持使用注解来控制方法的访问权限。常见的注解包括 @PreAuthorize 和 @Secured。
     4.1 使用 @PreAuthorize 注解
     @PreAuthorize 注解可以用于方法级别的权限控制。它可以在方法执行之前检查用户的权限。
     使用用户 asan 访问 /admin/dashboard 时提示无权限，使用 admin 访问则成功。
 *
 * 原文链接：https://blog.csdn.net/u014390502/article/details/142991973
 */
@RestController
public class AdminController {

    @GetMapping("/admin/dashboard")
    @PreAuthorize("hasRole('ADMIN')") // 只有 ADMIN 角色才能访问
    public String adminDashboard() {
        return "Welcome to Admin Dashboard!";
    }

    @GetMapping("/admin/getUserInfo")
    @PreAuthorize("hasRole('ADMIN') or #username == authentication.name")
    public String getUserInfo(String username) {
        // 当前登录用户是 ADMIN，或者请求的 username 与登录用户一致时允许访问
        return "User Info: " + username;
    }

}
